GSList *occurrences;
} CalendarAppointment;
+typedef struct
+{
+ ECalClient *client;
+ GHashTable *appointments;
+} CollectAppointmentsData;
+
static time_t
get_time_from_property (icalcomponent *ical,
icalproperty_kind prop_kind,
return retval;
}
-static gboolean
-calendar_appointment_collect_occurrence (ECalComponent *component,
- time_t occurrence_start,
- time_t occurrence_end,
- gpointer data)
+static CalendarAppointment *
+calendar_appointment_new (icalcomponent *ical,
+ ECalClient *cal)
{
- CalendarOccurrence *occurrence;
- GSList **collect_loc = data;
- char *rid;
-
- /* HACK: component is the primary event, so we don't have access
- * to the actual recur ID; fake one if the event has any
- * recurrences
- */
- if (e_cal_component_has_recurrences (component))
- rid = ctime (&occurrence_start);
- else
- rid = "";
-
- occurrence = g_new0 (CalendarOccurrence, 1);
- occurrence->start_time = occurrence_start;
- occurrence->end_time = occurrence_end;
- occurrence->rid = g_strdup (rid);
+ CalendarAppointment *appointment;
- *collect_loc = g_slist_prepend (*collect_loc, occurrence);
+ appointment = g_new0 (CalendarAppointment, 1);
- return TRUE;
+ calendar_appointment_init (appointment, ical, cal);
+ return appointment;
}
-static void
-calendar_appointment_generate_occurrences (CalendarAppointment *appointment,
- icalcomponent *ical,
- ECalClient *cal,
- time_t start,
- time_t end)
+static gboolean
+generate_instances_cb (ECalComponent *comp,
+ time_t start,
+ time_t end,
+ gpointer data)
{
- ECalComponent *ecal;
- icaltimezone *default_zone;
-
- g_assert (appointment->occurrences == NULL);
+ ECalClient *cal = ((CollectAppointmentsData *)data)->client;
+ GHashTable *appointments = ((CollectAppointmentsData *)data)->appointments;
+ CalendarAppointment *appointment;
+ CalendarOccurrence *occurrence;
+ const char *uid;
- default_zone = e_cal_client_get_default_timezone (cal);
+ e_cal_component_get_uid (comp, &uid);
+ appointment = g_hash_table_lookup (appointments, uid);
- ecal = e_cal_component_new ();
- e_cal_component_set_icalcomponent (ecal,
- icalcomponent_new_clone (ical));
+ if (appointment == NULL)
+ {
+ icalcomponent *ical = e_cal_component_get_icalcomponent (comp);
- e_cal_recur_generate_instances (ecal,
- start,
- end,
- calendar_appointment_collect_occurrence,
- &appointment->occurrences,
- (ECalRecurResolveTimezoneFn) resolve_timezone_id,
- cal,
- default_zone);
+ appointment = calendar_appointment_new (ical, cal);
+ g_hash_table_insert (appointments, g_strdup (uid), appointment);
+ }
- g_object_unref (ecal);
+ occurrence = g_new0 (CalendarOccurrence, 1);
+ occurrence->start_time = start;
+ occurrence->end_time = end;
+ occurrence->rid = e_cal_component_get_recurid_as_string (comp);
- appointment->occurrences = g_slist_reverse (appointment->occurrences);
+ appointment->occurrences = g_slist_append (appointment->occurrences, occurrence);
}
-static CalendarAppointment *
-calendar_appointment_new (icalcomponent *ical,
- ECalClient *cal)
-{
- CalendarAppointment *appointment;
-
- appointment = g_new0 (CalendarAppointment, 1);
-
- calendar_appointment_init (appointment, ical, cal);
- return appointment;
-}
/* ---------------------------------------------------------------------------------------------------- */
GError *error;
GSList *objects, *j;
ECalClientView *view;
+ CollectAppointmentsData data;
e_cal_client_set_default_timezone (cal, app->zone);
continue;
}
- error = NULL;
- objects = NULL;
- if (!e_cal_client_get_object_list_sync (cal,
- query,
- &objects,
- NULL, /* cancellable */
- &error))
- {
- ESource *source = e_client_get_source (E_CLIENT (cal));
- g_warning ("Error querying calendar %s: %s\n",
- e_source_get_uid (source), error->message);
- g_error_free (error);
- g_free (query);
- continue;
- }
-
- for (j = objects; j != NULL; j = j->next)
- {
- icalcomponent *ical = j->data;
- CalendarAppointment *appointment;
-
- appointment = calendar_appointment_new (ical, cal);
- calendar_appointment_generate_occurrences (appointment,
- ical,
- cal,
- app->since,
- app->until);
- g_hash_table_insert (app->appointments, g_strdup (appointment->uid), appointment);
- }
-
- e_cal_client_free_icalcomp_slist (objects);
+ data.client = cal;
+ data.appointments = app->appointments;
+ e_cal_client_generate_instances_sync (cal,
+ app->since,
+ app->until,
+ generate_instances_cb,
+ &data);
error = NULL;
if (!e_cal_client_get_view_sync (cal,
char *id = g_strdup_printf ("%s\n%s\n%s",
a->source_id,
a->uid,
- o->rid);
+ o->rid ? o->rid : "");
g_variant_builder_init (&extras_builder, G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (&builder,